home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 05 Programming / CRC-ML.TXT < prev    next >
Text File  |  2019-04-13  |  3KB  |  173 lines

  1.  
  2.  
  3. ********************************
  4. *   CRC PROTOCOL CALCULATION   *
  5. *   FOR COMMODORE COMPUTERS    *
  6. *        By Tom Brown          *
  7. ********************************
  8.  
  9.  
  10. calc = $1021
  11.  
  12.  
  13. ************************************
  14. * THE POLYNOMIAL $1021 IS FOR THE  *
  15. * CALCULATION 2^16 + 2^12 + 2^5 + 1*
  16. * THE NUMBER IS GOTTEN BY USING A  *
  17. * 1 IN EACH BIT CORRESPONDING TO   *
  18. * THE POLYNOMIAL.                  *
  19. * EG: $1021 HAS A 1 IN BIT 0,5,& 12*
  20. ************************************
  21.  
  22.  
  23.  
  24.  org $1300
  25.  
  26. *
  27. * FIRST, WE HAVE TO ERASE THE OLD
  28. * CRC VALUE AND INITIALIZE THE
  29. * POLYNOMIAL WE WILL USE FOR THE
  30. * CALCULATION. NOTE THAT THE POLY
  31. * VARIABLE CAN BE CHANGED IN ONE
  32. * PLACE TO BE USED BY THE WHOLE
  33. * ROUTINE.
  34. * A CALLING ROUTINE WILL CALL THIS
  35. * ONLY ONCE. SUBSEQUENT CALLS WILL
  36. * BE TO crcalc.
  37. *
  38.  
  39.  
  40. initcrc lda #0
  41.  sta crc ;CRC CALCULATION
  42.  sta crc+1
  43.  lda #<calc
  44.  sta poly ;POLYNOMIAL
  45.  lda #>calc
  46.  sta poly+1
  47.  rts
  48.  
  49.  
  50. *
  51. * THIS ROUTINE WILL CALCULATE THE
  52. * CRC CHECKSUM WITH THE BYTE CURRENTLY
  53. * IN THE ACCUMULATOR.
  54. *
  55.  
  56.  
  57. crcalc ldx #8 ;COUNT 8 BITS
  58. loop pha  ;SAVE DATA
  59.  
  60.  
  61. *
  62. * FIRST, WE xor BIT 7 OF DATA WITH
  63. * BIT 15 OF CRC (BIT 7 OF HIGH     TE)
  64. *
  65.  
  66.  
  67.  
  68.  and #127 ;GET BIT 7
  69.  eor crc+1 ;HIGH BYTE
  70.  sta crc+1
  71.  
  72.  
  73. *
  74. * NOW WE SHIFT CRC (HI & LOW BYTES)
  75. * LEFT ONE BIT. THE asl PUTS A 0 INTO
  76. * BIT 0 OF CRC LOW,SHIFTS CRC LOW BYTE
  77. * LEFT ONE BIT, BIT 7 FALLING INTO THE
  78. * CARRY. THE rol SHIFTS THE CRC HIGH
  79. * BYTE LEFT 1 BIT, THE CARRY IS MOVED
  80. * INTO BIT 0 OF CRC HIGH BYTE, AND BIT
  81. * 7 FALLS INTO THE NOW-EMPTY CARRY
  82. *
  83.  
  84.  
  85.  clc  ;CLEAR CARRY
  86.  asl crc ;SHIFT LOW BYTE
  87.  rol crc+1 ;NOW HIGH
  88.  bcc crcalc1
  89.  
  90.  
  91. *
  92. * BIT 15 (BIT 7 OF HIGH CRC BYTE) OF
  93. * CRC WAS     IFTED INTO THE CARRY.
  94. * IF THIS BIT WAS 1 THEN EXCLUSIVE-OR
  95. * THE CRC WITH THE POLYNOMIAL
  96. *
  97.  
  98.  
  99.  lda poly ;POLYNOMIAL LOW
  100.  eor crc ;CRC LOW BYTE
  101.  sta crc
  102.  lda poly+1 ;POLYNOMIAL HIGH
  103.  eor crc+1
  104.  sta crc+1
  105.  
  106.  
  107. *
  108. * NOW WE SHIFT THE DATA BYTE LEFT 1 BIT
  109. * AND DECREMENT OUR BIT COUNTER
  110. * AS LONG AS IT'S NOT ZERO, WE CONTINUE
  111. * OUR BITWISE CALCULATION
  112. *
  113.  
  114.  
  115. crcalc1 pla  ;RESTORE DATA
  116.  asl  ;NEW BIT 7
  117.  dex  ;DEC BIT COUNT
  118.  bne loop
  119.  rts  ;WHEW! DONE.
  120.  
  121.  
  122. *
  123. * THESE ARE THE DATA BYTES
  124. *
  125.  
  126. crc hex 0000
  127. poly hex 00    
  128.  
  129.  
  130. ********************************
  131. * THIS SOURCECODE WOULD NOT BE *
  132. * POSSIBLE WITHOUT THE HELP OF *
  133. * BOB UMFER AND PETE BOSWELL   *
  134. * (AKA topper), BOTH OF plink  *
  135. ********************************
  136.  
  137.  
  138. ********************************
  139. * THIS CODE WAS WRITTEN ON THE *
  140. * merlin ASSEMBLER, FOR THE    *
  141. * COMMODORE 128. JUST CHANGE   *
  142. * THE LOAD LOCATION FOR THE 64 *
  143. * AS THERE ARE NO MACHINE      *
  144. * SPECIFIC ROUTINES USED       *
  145. ********************************
  146.  
  147.  
  148.  
  149. The following is the BASIC source    de in Basic 7.0 for the C-128
  150. to test the machine language CRC calculation routine.
  151. Answer 1 to the prompt each time & you should get the following
  152. sequence of numbers:
  153.  
  154. HIGH BYTE       LOW BYTE     COMBINED VALUE
  155. =========       ========     ==============
  156.  
  157.    16              33            4129
  158.    35              16            8976
  159.    20              32            5152
  160.    98             148           25236
  161.  
  162.  
  163. All values are, of course, in decimal
  164.  
  165.  
  166.  
  167. 10 SYS(DEC("1300"))
  168. 20 INPUT"ENTER VALUE";A$:A=VA    A$)
  169. 30 SYS(DEC("1313")),A:A=PEEK(DEC("1340")):B=PEEK(DEC("133F"))
  170. 40 C=(A*256)+B
  171. 50 PRINTA,B,C
  172. 60 GOTO20
  173.